<!doctype html>



  


<html class="theme-next mist use-motion">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.0.1" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="Automated build tools," />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.0.1" />






<meta name="description" content="说明：Maven自动化构建工具简单灵活，提供缺省设置和高级项目管理等功能，比Ant要简单很多。">
<meta name="keywords" content="Automated build tools">
<meta property="og:type" content="article">
<meta property="og:title" content="Maven">
<meta property="og:url" content="http://bebetter.site/2017/01/12/Software/Automated build tools 自动化构建工具/Maven/index.html">
<meta property="og:site_name" content="gatewayzy">
<meta property="og:description" content="说明：Maven自动化构建工具简单灵活，提供缺省设置和高级项目管理等功能，比Ant要简单很多。">
<meta property="og:updated_time" content="2017-01-12T05:58:56.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Maven">
<meta name="twitter:description" content="说明：Maven自动化构建工具简单灵活，提供缺省设置和高级项目管理等功能，比Ant要简单很多。">



<script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Mist',
    sidebar: {"position":"right","display":"always"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 0,
      author: '博主'
    }
  };
</script>




  <link rel="canonical" href="http://bebetter.site/2017/01/12/Software/Automated build tools 自动化构建工具/Maven/"/>

  <title> Maven | gatewayzy </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-right page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">gatewayzy</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">blog of gatewayzy</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
    </ul>
  

  
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                Maven
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2017-01-12T13:58:13+08:00" content="2017-01-12">
              2017-01-12
            </time>
          </span>

          
            <span class="post-category" >
              &nbsp; | &nbsp;
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="https://schema.org/Thing">
                  <a href="/categories/Softwares/" itemprop="url" rel="index">
                    <span itemprop="name">Softwares</span>
                  </a>
                </span>

                
                

              
            </span>
          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        <p><strong>说明：</strong>Maven自动化构建工具简单灵活，提供缺省设置和高级项目管理等功能，比Ant要简单很多。<br><a id="more"></a></p>
<hr>
<p>参考文章：</p>
<h2 id="Make、ant、maven等工具比较"><a href="#Make、ant、maven等工具比较" class="headerlink" title="Make、ant、maven等工具比较"></a>Make、ant、maven等工具比较</h2><hr>
<p>项目构建工具用的较多的是：ant、maven、hudson、gradle。</p>
<ul>
<li>Make<ul>
<li>Make属于早期项目构建工具，主要用于类Unix系统（Linux、mac os、 FreeBSD等）衍生的GNU make、BSD make以及windows的Microsoft nmake。Make由makefile脚本驱动，语法包括target、prerequisite、command等。</li>
<li>Make功能强大，与系统命令结合。语法死板，难以跨平台。</li>
</ul>
</li>
<li>Ant<ul>
<li>Another Neat Tool，基于java，配置构建脚本build.xml的target、depends、task等。由apache开发。</li>
<li>跨平台，但是还是重复编译构建等命令，依赖管理要手工或者用Ivy管理。Ant与make都是面向过程的。</li>
</ul>
</li>
<li>Maven<ul>
<li>Maven基于面向项目模型（project object model，pom），具有大量插件和强大的中央仓库，也是Apache开发。</li>
<li>Maven的“简单和依靠约定”提供现成可调用的goal，生命周期简单。但是牺牲灵活性，依赖的版本冲突问题难以解决，目标goal定制化困难，难以写出复杂的构建脚本。</li>
</ul>
</li>
<li>Gradle<ul>
<li>DSL（Domain Specific Languages，领域特定语言)通常的想法是设计一套能够解决特定领域问题的语言。在构建这方面，DSL的一个成功案例就是Gradle。</li>
<li>Grandle结合ant与maven优点，灵活而易用。基于groovy语言，目前支持java、groovy、Scala。</li>
</ul>
</li>
</ul>
<h2 id="Maven基础"><a href="#Maven基础" class="headerlink" title="Maven基础"></a>Maven基础</h2><hr>
<p>Maven主要作用：项目构建、依赖管理、项目信息管理（如生命周期）。</p>
<h3 id="Maven生命周期管理"><a href="#Maven生命周期管理" class="headerlink" title="Maven生命周期管理"></a>Maven生命周期管理</h3><hr>
<p>maven有3个独立的生命周期：clean、default、site。</p>
<ul>
<li>Clean：清理，主要包括pre-clean、clean、post-clean。</li>
<li>Default：构建的所有步骤，含validate、initialize、generate-resources、test、package、install、deploy等等阶段。</li>
<li>Site：建立和发布站点，含pre-site、site、post-site、site-deploy阶段。<br>maven命令会调用各个独立生命周期的相应阶段，如mvn clean，mvn test，mvn clean install，mvn clean deploy site-deploy等等组合命令。</li>
</ul>
<h3 id="Maven-jar包"><a href="#Maven-jar包" class="headerlink" title="Maven jar包"></a>Maven jar包</h3><hr>
<h4 id="Maven坐标"><a href="#Maven坐标" class="headerlink" title="Maven坐标"></a>Maven坐标</h4><p>Maven为每一个jar包提供了坐标管理，保证能够定位、区分每一个jar包，方便管理jar包之间的依赖关系。<br>Maven坐标由3部分组成：<code>&lt;groupId&gt;、&lt;artifactId&gt;、&lt;version&gt;</code>。<br>本文简写：G：groupId        A：artifactId        V：version</p>
<h4 id="依赖管理"><a href="#依赖管理" class="headerlink" title="依赖管理"></a>依赖管理</h4><p>在POM 4中，<dependency>中还引入了<scope>，它主要管理依赖的部署。目前<scope>可以使用5个值：</scope></scope></dependency></p>
<ul>
<li>compile，缺省值，适用于所有阶段，会随着项目一起发布。</li>
<li>provided，类似compile，期望JDK、容器或使用者会提供这个依赖。如servlet.jar。</li>
<li>runtime，只在运行时使用，如JDBC驱动，适用运行和测试阶段。</li>
<li>test，只在测试时使用，用于编译和运行测试代码。不会随项目发布。</li>
<li>system，类似provided，需显式提供包含依赖的jar，Maven不会在Repository中查找它。</li>
</ul>
<h4 id="依赖排除"><a href="#依赖排除" class="headerlink" title="依赖排除"></a>依赖排除</h4><p>如<optional>true</optional>，进行项目间依赖传递。<br>如exclusions进行依赖过滤。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">&lt;dependency&gt;    </div><div class="line">  &lt;groupId&gt;org.apache.hbase&lt;/groupId&gt;</div><div class="line">  &lt;artifactId&gt;hbase&lt;/artifactId&gt;</div><div class="line">  &lt;version&gt;0.94.17&lt;/version&gt; </div><div class="line">  &lt;exclusions&gt;  </div><div class="line">     &lt;exclusion&gt;	 </div><div class="line">       &lt;groupId&gt;commons-logging&lt;/groupId&gt;		</div><div class="line">       &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;  </div><div class="line">     &lt;/exclusion&gt;  </div><div class="line">  &lt;/exclusions&gt;  </div><div class="line">&lt;/dependency&gt;</div></pre></td></tr></table></figure>
<h3 id="Maven仓库解析"><a href="#Maven仓库解析" class="headerlink" title="Maven仓库解析"></a>Maven仓库解析</h3><hr>
<h4 id="仓库解析"><a href="#仓库解析" class="headerlink" title="仓库解析"></a>仓库解析</h4><ul>
<li>依赖范围scope为system的jar将从本地文件系统查找依赖。</li>
<li>其他jar会在确定版本后先从本地仓库查找依赖，本地没有则访问远程仓库。</li>
<li>如果是SNAPSHOT版本，则检查所有远程相应的maven-metadata.xml（在G/A/下），与本地对应的元数据合并后，确定最新的快照版本。</li>
<li>如果是RELEASE或LATEST版本，也检查所有远程相应的maven-metadata.xml，确定版本。由于该xml中含有release（最新发行版）、versions（所有版本，包括快照版等）、lastUpdated（最新时间戳版本）的版本，不同xml记录的内容不容，综合后可能导致latest经常变化且不稳定，release版本会更新到最新的发行版，所以不建议用latest。</li>
<li>Maven有一个超级pom文件，超级pom对maven仓库、结构等进行配置，所有的pom都根据超级pom的规范进行配置描述。maven3的超级pom位置为<code>maven/lib/maven-model-builder-*.jar</code> 中的 <code>org/***/model/pom-4.0.0.xml</code>。（maven3使用pom4文件描述格式）</li>
</ul>
<h4 id="远程仓库版本过滤"><a href="#远程仓库版本过滤" class="headerlink" title="远程仓库版本过滤"></a>远程仓库版本过滤</h4><p>通过配置远程仓库进行版本过滤。如<code>&lt;repository&gt;</code>中设置<code>&lt;releases&gt;</code>为true，<code>&lt;snapshots&gt;</code>为false，<code>&lt;layout&gt;</code>default为maven2和maven3的文件布局而非maven1。在<code>&lt;releases&gt;</code>下设置以下值：<code>&lt;updatePolicy&gt;</code>为daily，<code>&lt;checksumPolicy&gt;</code>为ignore，这表示使用这个远程repo时使用release版本，不使用快照版，版本每天更新，不进行和校验。</p>
<h3 id="Maven插件"><a href="#Maven插件" class="headerlink" title="Maven插件"></a>Maven插件</h3><hr>
<p>Maven核心了抽象生命周期，执行由插件完成，二者绑定在一起。</p>
<h4 id="插件介绍"><a href="#插件介绍" class="headerlink" title="插件介绍"></a>插件介绍</h4><ul>
<li>插件的goal：一个插件可以根据项目依赖完成不同的plugin goal，表示为插件:目标，如依赖插件dependency的一些目标组合为dependency：tree，dependency：list等等。</li>
<li>插件的下载：虽然存放方式和依赖一样的GAV，但是如果本地没有插件的话，是不会自动去远程仓库下载的。</li>
<li>插件的前缀：插件的前缀可以省略，如dependency：analyze完整的是mvn org.apache.plugins:maven-dependency-plugin:2.1:tree，也就是说完整的是G:A:V:goal。其中插件目标省略时自动添加Apache或Codehaus的插件groupId以及用户自定义的插件groupId，而dependency是该插件的前缀，起简称作用，版本默认使用最新版本，依maven版本存在稳定版与快照版差别。</li>
<li>插件命令与参数：mvn help:descripe –Dplugin=compiler –Ddetail就是用maven-help-plugin帮助插件查看其它插件（如compiler）信息，describe是goal，后面参数都要用java的参数表示方式-D添加，-Ddetail表示详细信息。mvn install –Dmaven.test.skip=true表示生成项目代码并且跳过测试用例。</li>
</ul>
<h4 id="常用插件"><a href="#常用插件" class="headerlink" title="常用插件"></a>常用插件</h4><ul>
<li>maven-compiler-plugin进行项目项目编译。maven-war-plugin支持项目war打包。</li>
<li>Jetty-maven-plugin支持IDE中自动编译，由于是非官方插件注意添加repo库，需设置扫描间隔，否则不会自动编译。</li>
<li>maven-jetty-plugin支持maven 命令行运行jetty发布项目。使用方法是运行mvn jetty:run –Djetty.port=8081 使用jetty发布当前目录下的项目，并设置端口为8081。</li>
<li>cargon-maven2-plugin插件支持自动化部署到web容器中，包括本地部署和远端部署。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div></pre></td><td class="code"><pre><div class="line">&lt;build&gt;</div><div class="line">	&lt;finalName&gt;tcm&lt;/finalName&gt;</div><div class="line">	&lt;plugins&gt;</div><div class="line">		&lt;plugin&gt;</div><div class="line">			&lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;</div><div class="line">			&lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;</div><div class="line">			&lt;version&gt;6.1.10&lt;/version&gt;</div><div class="line">			&lt;configuration&gt;</div><div class="line">				&lt;scanIntervalSeconds&gt;10&lt;/scanIntervalSeconds&gt;</div><div class="line">				&lt;webAppConfig&gt;</div><div class="line">					&lt;contextPath&gt;/test&lt;/contextPath&gt;</div><div class="line">				&lt;/webAppConfig&gt;</div><div class="line">			&lt;/configuration&gt;</div><div class="line">		&lt;/plugin&gt;</div><div class="line">		&lt;plugin&gt;</div><div class="line">			&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;</div><div class="line">			&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;</div><div class="line">			&lt;version&gt;3.1&lt;/version&gt;</div><div class="line">			&lt;configuration&gt;</div><div class="line">				&lt;source&gt;1.6&lt;/source&gt;</div><div class="line">				&lt;target&gt;1.6&lt;/target&gt;</div><div class="line">				&lt;encoding&gt;UTF-8&lt;/encoding&gt;</div><div class="line">			&lt;/configuration&gt;</div><div class="line">		&lt;/plugin&gt;</div><div class="line">		&lt;plugin&gt;</div><div class="line">			&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;</div><div class="line">			&lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;</div><div class="line">			&lt;configuration&gt;</div><div class="line">				&lt;webXml&gt;$&#123;webXmlPath&#125;&lt;/webXml&gt;</div><div class="line">			&lt;/configuration&gt;</div><div class="line">		&lt;/plugin&gt;</div><div class="line">	&lt;/plugins&gt;</div><div class="line">&lt;/build&gt;</div></pre></td></tr></table></figure>
<p>一般情况下jar包都可以使用pom.xml来配置管理，但也有一些时候，我们项目中使用了一个内部jar文件，但是这个文件我们又没有开放到maven库中。为了方便，可以将jar放在WEB-INF/lib/中，本地运行的时候将jar添加到build path中，打包运行的时候用下面的配置。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">&lt;plugin&gt;</div><div class="line">    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;</div><div class="line">    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;</div><div class="line">    &lt;version&gt;3.1&lt;/version&gt;</div><div class="line">    &lt;configuration&gt;</div><div class="line">        &lt;source&gt;1.7&lt;/source&gt;</div><div class="line">        &lt;target&gt;1.7&lt;/target&gt;</div><div class="line">        &lt;encoding&gt;UTF-8&lt;/encoding&gt;</div><div class="line">        &lt;compilerArgs&gt; </div><div class="line">            &lt;arg&gt;-verbose&lt;/arg&gt;</div><div class="line">            &lt;arg&gt;-Xlint:unchecked&lt;/arg&gt;</div><div class="line">            &lt;arg&gt;-Xlint:deprecation&lt;/arg&gt;</div><div class="line">            &lt;arg&gt;-bootclasspath&lt;/arg&gt;</div><div class="line">            &lt;arg&gt;$&#123;env.JAVA_HOME&#125;/jre/lib/rt.jar&lt;/arg&gt;</div><div class="line">            &lt;arg&gt;-extdirs&lt;/arg&gt; </div><div class="line">            &lt;arg&gt;$&#123;project.basedir&#125;/src/main/webapp/WEB-INF/lib&lt;/arg&gt;</div><div class="line">        &lt;/compilerArgs&gt; </div><div class="line">    &lt;/configuration&gt;</div><div class="line">&lt;/plugin&gt;</div></pre></td></tr></table></figure>
<p>其中${project.basedir}一定要写，不然会出现“在windows”下可以正常编译，在Linux服务器上就“有可能”出现编译找不到jar包的错误。</p>
<h3 id="Maven运行内存设置"><a href="#Maven运行内存设置" class="headerlink" title="Maven运行内存设置"></a>Maven运行内存设置</h3><hr>
<p>一般java默认分配内存不够maven build使用，就可以设置MAVEN_OPTS选项进行修改，防止内存溢出。可尝试以下方法。</p>
<h4 id="修改项目的maven-build内存"><a href="#修改项目的maven-build内存" class="headerlink" title="修改项目的maven build内存"></a>修改项目的maven build内存</h4><ul>
<li>Eclipse中项目进行maven build内存不足时，可以在项目上右击 -&gt; Run As -&gt; Run Configurations -&gt; Maven Build中为jre的VM arguments中输入配置如：-Xms128m -Xmx512m。</li>
<li>Eclipse中如果是jetty运行内存不足，也可以类似的为项目右键run as jetty的配置设置arguments为-Xms128m –Xmx512m表示给jetty分配更大的内存。</li>
</ul>
<h4 id="修改maven的内存配置"><a href="#修改maven的内存配置" class="headerlink" title="修改maven的内存配置"></a>修改maven的内存配置</h4><ul>
<li>找到文件%M2_HOME%\bin\mvn.bat，在启动Maven的脚本中找到注释：@REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE…它的意思是你可以设置一些Maven参数，在注释下面加入一行：set MAVEN_OPTS= -Xms128m -Xmx512m</li>
</ul>
<h4 id="添加系统环境变量"><a href="#添加系统环境变量" class="headerlink" title="添加系统环境变量"></a>添加系统环境变量</h4><ul>
<li>Windows下就是添加系统环境变量变量名是MAVEN_OPTS，值为 -Xmx1024m。</li>
<li>Linux下添加就是编辑文件 /etc/profile添加MAVEN_OPTS=-Xmx512m或者运行export JAVA_HOME MAVEN_HOME MAVEN_OPTS JAVA_BIN PATH CLASSPATH。</li>
</ul>
<h3 id="Maven项目的版本规定"><a href="#Maven项目的版本规定" class="headerlink" title="Maven项目的版本规定"></a>Maven项目的版本规定</h3><hr>
<p>Maven项目版本号，版本之主干、分支、标签。<br>GPG（GnuPG）是PGP（Pretty Good Privacy）的一个免费实现。常用于email加解密以及提供签名。可用于构件签名，增强安全性。在<code>&lt;build&gt;</code>中添加并设置maven-gpg-plugin。</p>
<h3 id="习惯优于配置"><a href="#习惯优于配置" class="headerlink" title="习惯优于配置"></a>习惯优于配置</h3><hr>
<ul>
<li>Maven使用习惯优于配置的方法。自动设置默认的文件结构，classpath等设置，这些在超级pom中进行了约定。</li>
<li>Java Resources （包在Classpath中）：src/main/java（源代码），src/main/resource（资源配置），src/test/java（测试代码）。<br>Target（以web项目为例）：src/main/webapp（对应/）。</li>
</ul>
<h3 id="聚合与继承"><a href="#聚合与继承" class="headerlink" title="聚合与继承"></a>聚合与继承</h3><hr>
<ul>
<li>聚合是将多个模块用一个pom packaging的pom进行整合<modules>。、</modules></li>
<li>集成是多个模块继承<code>&lt;parent&gt;</code>，且可以在父类中用<code>&lt;dependencyManagement&gt;</code>和<code>&lt;pluginManagement&gt;</code>对子类的依赖和插件进行管理，子类要设置<code>&lt;relativePath&gt;</code>。</li>
<li>一般一个pom既是聚合pom又是父pom。</li>
</ul>
<h3 id="灵活构建：属性、profile、资源过滤三大特性"><a href="#灵活构建：属性、profile、资源过滤三大特性" class="headerlink" title="灵活构建：属性、profile、资源过滤三大特性"></a>灵活构建：属性、profile、资源过滤三大特性</h3><hr>
<p>组合使用：将变化的配置设置成maven属性，然后为资源目录开启资源过滤，并在profile中设置相应的值并激活。</p>
<h4 id="属性"><a href="#属性" class="headerlink" title="属性"></a>属性</h4><ol>
<li>内置属性：<code>${basedir}</code>项目根目录，<code>${version}</code>项目版本；</li>
<li>Pom属性：pom文件中对应元素的值。${project.name}是<code>&lt;project&gt;&lt;name&gt;</code>元素的值，${project.build.sorceDirectory}等等。</li>
<li>自定义属性：pom中的<code>&lt;properties&gt;</code></li>
<li>Settings属性：settings.表示使用settings.xml中的值，如${settings.localRepository}。</li>
<li>Java系统属性：使用mvn help:system可以查看java平台及环境变量属性，java平台属性也可以用maven引用。如${user.home}。</li>
<li>环境变量属性：如${evn.JAVA_HOME}，即以evn.开头。</li>
</ol>
<h4 id="资源过滤"><a href="#资源过滤" class="headerlink" title="资源过滤"></a>资源过滤</h4><ul>
<li>Maven默认只有pom文件中的属性才会进行解析，如果是其他资源文件并不会将${name}当做属性进行赋值处理。</li>
<li>这时需要使用maven-resources-plugin，它默认并不开启资源过滤功能，而只是将main和test文件复制到相应地目录下。如果要对resources目录进行过滤，则需要在超级pom中对<code>&lt;resource&gt;</code>添加<code>&lt;filtering&gt;true&lt;/filtering&gt;</code>。其它resource也只需这一句filtering开启。</li>
</ul>
<h4 id="Profile"><a href="#Profile" class="headerlink" title="Profile"></a>Profile</h4><ul>
<li>Profile可以放在pom.xml、用户的settings.xml、全局的settings.xml中，只是在有效范围上的差别。</li>
</ul>
<h4 id="激活方式："><a href="#激活方式：" class="headerlink" title="激活方式："></a>激活方式：</h4><ul>
<li>命令行激活：如mvn install –Pdevx, -Pdevy 支持同时激活多个配置。例如下面在打包的时候使用mvn clean package -Pplatform -Dmaven.test.skip=true，就是激活id为platform的profile并且跳过测试。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">&lt;profiles&gt;</div><div class="line">		&lt;profile&gt;</div><div class="line">			&lt;id&gt;dev&lt;/id&gt;</div><div class="line">			&lt;properties&gt;</div><div class="line">				&lt;webXmlPath&gt;src/main/webapp/WEB-INF/web.xml&lt;/webXmlPath&gt;</div><div class="line">			&lt;/properties&gt;</div><div class="line">		&lt;/profile&gt;</div><div class="line">		&lt;profile&gt;</div><div class="line">			&lt;id&gt;platform&lt;/id&gt;</div><div class="line">			&lt;properties&gt;</div><div class="line">				&lt;webXmlPath&gt;src/main/webapp/WEB-INF/config/webs/web_platform.xml&lt;/webXmlPath&gt;</div><div class="line">			&lt;/properties&gt;</div><div class="line">		&lt;/profile&gt;</div><div class="line">	&lt;/profiles&gt;</div></pre></td></tr></table></figure>
<ul>
<li>Settings文件中显示激活：<code>&lt;activeProfiles&gt;</code>中配置。</li>
<li>Profiles定义时默认激活：<code>&lt;activation&gt;&lt;activeByDefault&gt;</code>为true。</li>
<li>Profiles定义时系统属性激活、操作系统环境激活、文件是否存在激活。</li>
</ul>
<h2 id="Maven-使用"><a href="#Maven-使用" class="headerlink" title="Maven 使用"></a>Maven 使用</h2><hr>
<h3 id="Maven配置"><a href="#Maven配置" class="headerlink" title="Maven配置"></a>Maven配置</h3><ul>
<li>下载apache-maven后，配置conf中的setting.xml，修改本地仓库目录如下，因为默认会放到用户的home目录下的.m2。</li>
<li><code>&lt;localRepository&gt;D:/Project/m2/repository&lt;/localRepository&gt;</code></li>
<li>其中还可以设置maven的代理、远端仓库、仓库镜像、profiles等。如设置maven全局镜像如下。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&lt;mirrors&gt; </div><div class="line">       &lt;id&gt;tcm&lt;/id&gt;  </div><div class="line">       &lt;name&gt;tcm repo&lt;/name&gt;  </div><div class="line">       &lt;url&gt;http://10.15.82.93:8081/nexus/content/groups/public/&lt;/url&gt;  </div><div class="line">       &lt;mirrorOf&gt;*&lt;/mirrorOf&gt;</div><div class="line">&lt;/mirrors&gt;</div></pre></td></tr></table></figure>
<h4 id="Eclipse中使用maven"><a href="#Eclipse中使用maven" class="headerlink" title="Eclipse中使用maven"></a>Eclipse中使用maven</h4><ul>
<li>Eclipse如果没有maven支持则需要先安装m2eclipse插件，在maven模块中关联上自己下载的maven（不推荐使用内置的maven），然后在user setting中更新上面设置好的setting.xml。</li>
<li>m2eclipse插件的地址是<code>http://m2eclipse.sonatype.org/sites/m2e</code>，不要使用不稳定的<code>http://download.eclipse.org/technology/ m2e/releases</code>。 </li>
<li>Eclipse可以对maven项目进行maven clean、update maven project等操作。</li>
<li>使用eclipse运行maven项目：可以run as maven install等生成target，找到目录下的war包，拷贝到tomcat的webapps中，启动猫可以自动解压部署。可以安装runjettyrun插件进行项目run as jetty。</li>
</ul>
<h4 id="Maven命令行管理项目"><a href="#Maven命令行管理项目" class="headerlink" title="Maven命令行管理项目"></a>Maven命令行管理项目</h4><p>将maven目录添加到系统环境变量M2_HOME，并在path中添加%M2_HOME%\bin。<br>在cmd到项目目录中进行mvn install、mvn clean、mvn jetty:run等操作，注意命令行方式需要在项目pom的build中配置相应的插件坐标，如compiler、jetty等插件。</p>
<h4 id="eclipse建立Maven项目"><a href="#eclipse建立Maven项目" class="headerlink" title="eclipse建立Maven项目"></a>eclipse建立Maven项目</h4><p>建立maven项目可以使用模板，如webapp模板、quickstart模板。导入maven项目时，如果下载依赖只有pom和sha1文件没有jar包，可能是被墙了，可以复制别人的repo仓库中的jar，或者建立nexus私服等方式共享jar。</p>
<h3 id="常用的repo仓库"><a href="#常用的repo仓库" class="headerlink" title="常用的repo仓库"></a>常用的repo仓库</h3><hr>
<ul>
<li>一些repo镜像地址如下，部分网站可能无法正常访问，一些特殊的jar需要网上搜索相应的repo网址。<ul>
<li><a href="https://repo.maven.apache.org/maven2/（central仓库）" target="_blank" rel="external">https://repo.maven.apache.org/maven2/（central仓库）</a></li>
<li><a href="http://uk.maven.org/maven2/（推荐）" target="_blank" rel="external">http://uk.maven.org/maven2/（推荐）</a></li>
<li><a href="http://repository.sonatype.org/content/groups/public/" target="_blank" rel="external">http://repository.sonatype.org/content/groups/public/</a></li>
<li><a href="http://repository.jboss.org/nexus/content/groups/public/" target="_blank" rel="external">http://repository.jboss.org/nexus/content/groups/public/</a></li>
<li><a href="http://maven.oschina.net/content/groups/public/" target="_blank" rel="external">http://maven.oschina.net/content/groups/public/</a></li>
</ul>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">&lt;repositories&gt;</div><div class="line">	&lt;repository&gt;</div><div class="line">		&lt;id&gt;uk&lt;/id&gt;</div><div class="line">		&lt;name&gt;uk-repo&lt;/name&gt;</div><div class="line">		&lt;url&gt;http://uk.maven.org/maven2/&lt;/url&gt;</div><div class="line">	&lt;/repository&gt;</div><div class="line">	&lt;repository&gt;</div><div class="line">		&lt;id&gt;xss-html-filter releases&lt;/id&gt;</div><div class="line">		&lt;name&gt;xss-html-filter Releases Repository&lt;/name&gt;</div><div class="line">		&lt;url&gt;http://xss-html-filter.sf.net/releases/&lt;/url&gt;</div><div class="line">	&lt;/repository&gt;</div><div class="line">	&lt;repository&gt;</div><div class="line">		&lt;id&gt;mvn-repo&lt;/id&gt;</div><div class="line">		&lt;url&gt;http://maven.ansj.org/&lt;/url&gt;</div><div class="line">	&lt;/repository&gt;</div><div class="line">&lt;/repositories&gt;</div></pre></td></tr></table></figure>
<h2 id="问题与解决"><a href="#问题与解决" class="headerlink" title="问题与解决"></a>问题与解决</h2><hr>
<h3 id="错误Dynamic-Web-Module-3-0-requires-Java-1-6-or-newer"><a href="#错误Dynamic-Web-Module-3-0-requires-Java-1-6-or-newer" class="headerlink" title="错误Dynamic Web Module 3.0 requires Java 1.6 or newer"></a>错误Dynamic Web Module 3.0 requires Java 1.6 or newer</h3><ul>
<li>这是由于你的 Maven 编译级别是 jdk1.5 或以下，而你导入了 jdk1.6 以上的依赖包。</li>
<li>可以修改项目的.classpath 文件，调整其中的JavaSE的版本。</li>
<li>可以指明项目编译的jdk版本设置：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">&lt;build&gt;  </div><div class="line">    &lt;plugins&gt;  </div><div class="line">        &lt;!-- define the project compile level --&gt;  </div><div class="line">        &lt;plugin&gt;  </div><div class="line">            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;  </div><div class="line">            &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;  </div><div class="line">            &lt;version&gt;2.3.2&lt;/version&gt;  </div><div class="line">            &lt;configuration&gt;  </div><div class="line">                &lt;source&gt;1.8&lt;/source&gt;  </div><div class="line">                &lt;target&gt;1.8&lt;/target&gt;  </div><div class="line">            &lt;/configuration&gt;  </div><div class="line">        &lt;/plugin&gt;  </div><div class="line">    &lt;/plugins&gt;  </div><div class="line">&lt;/build&gt;</div></pre></td></tr></table></figure>
<h3 id="错误missing-artifact：…jar"><a href="#错误missing-artifact：…jar" class="headerlink" title="错误missing artifact：…jar"></a>错误missing artifact：…jar</h3><ul>
<li>导入maven项目后提示错误：Missing artifact com.company.air:…:jar:1.0.1。</li>
<li>常见引起jar包丢失错误的原因总结：<ul>
<li>引入的包在所有的repo中不存在，要么找含有该jar的repo，要么手动下载并添加到build path；</li>
<li>引入的jar包的pom中引用了一些jar包，但那些jar包在repo中不存在，要么手动下载并添加该jar，要么添加存在被引用的jar包的repo；</li>
<li>下载jar包失败时引入的.lastUpdated文件阻止了jar包下载，应该全部删除此类型文件并update。</li>
</ul>
</li>
<li>解决方法：<ul>
<li>可以尝试本地repo中删除.lastUpdated、-not-available等非jar包，强制更新项目依赖（update maven project中的force update snapshot/release），解决的核心就是保证相应的jar包能下载到，并且没有.lastUpdated文件。</li>
<li>实在找不到相应的repo时，可以自建私服并上传该jar包，或者将jar包放到项目中链接。</li>
<li>如果本地已经下载到了一些jar，但是还是提示一大堆的jar缺失，应该从第一个缺失的jar开始排查私服上是否有对应的jar文件（最好从第一个错误提示开始排查错误，因为之后的错误提示很可能是因为第一个错误引起的）。</li>
</ul>
</li>
</ul>
<h3 id="错误Failed-to-read-artifact-descriptor-for-org-fnlp-fnlp-core-jar-2-1"><a href="#错误Failed-to-read-artifact-descriptor-for-org-fnlp-fnlp-core-jar-2-1" class="headerlink" title="错误Failed to read artifact descriptor for org.fnlp:fnlp-core:jar:2.1"></a>错误Failed to read artifact descriptor for org.fnlp:fnlp-core:jar:2.1</h3><ul>
<li>这是由于jar包引入了其他依赖包，但是被依赖的包却下载不到。</li>
<li>解决方法：将本jar包复制到项目中链接，或者删除依赖，后者寻找被依赖的jar包。</li>
</ul>
<h3 id="缺少src-test-java等目录"><a href="#缺少src-test-java等目录" class="headerlink" title="缺少src/test/java等目录"></a>缺少src/test/java等目录</h3><ul>
<li>在项目上右键选择properties，然后点击java build path，在Library下，选择JRE System Library进行编辑，选择workspace default jre就可以了。</li>
<li>还有一种方式是自己手动添加source folder，方法是新建-&gt;source folder-&gt;路径为src/test/resources。</li>
</ul>
<h2 id="Maven私服Nexus"><a href="#Maven私服Nexus" class="headerlink" title="Maven私服Nexus"></a>Maven私服Nexus</h2><hr>
<p>Sonatype-Nexus是Sonatype公司的提供建立maven私服进行仓库管理的软件，还有一些其他repo管理软件这里不做介绍。</p>
<h3 id="安装启动nexus"><a href="#安装启动nexus" class="headerlink" title="安装启动nexus"></a>安装启动nexus</h3><hr>
<h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><ul>
<li>解压nexus-2.11.3-01.zip文件夹到一个目录，sonatype-work.zip同样操作。</li>
<li>将nexus的bin路径添加到path中。</li>
<li>管理员身份运行 nexus install    、nexus start，成功的话nexus就会开机启动，并已经作为一个系统服务了。</li>
<li>可能遇到的错误信息：The nexus service was launched, but failed to start。<ul>
<li>出错原因：找不到java虚拟机或者版本不一致。</li>
<li>解决方法：安装java即可解决。如果还有问题，可以通过指定nexus-2.1.1\bin\jsw\conf\wrapper.conf文件中的wrapper.java.command=D:\Program Files\Java\jdk1.7.0_05\bin\java.exe相应解决。</li>
</ul>
</li>
</ul>
<h4 id="启动nexus"><a href="#启动nexus" class="headerlink" title="启动nexus"></a>启动nexus</h4><ul>
<li>启动可以通过查看系统服务，启动nexus服务。 Nexus默认端口是8081，在nexus/conf/nexus.properties中修改。</li>
<li>访问<code>http://127.0.0.1:8081/nexus/</code>。点击右上角Log In，使用用户名：admin，密码：admin123，可使用repo管理等功能。</li>
</ul>
<h3 id="Nexus配置"><a href="#Nexus配置" class="headerlink" title="Nexus配置"></a>Nexus配置</h3><hr>
<h4 id="Nexus使用代理上网"><a href="#Nexus使用代理上网" class="headerlink" title="Nexus使用代理上网"></a>Nexus使用代理上网</h4><ul>
<li>可以用可连接外网的服务器开启代理。如用ccproxy设置“设置”-&gt;高级。</li>
<li>可以在nexus主页中，左侧的administration-&gt;server中，设置http代理选项：Default HTTP Proxy Settings。</li>
</ul>
<h3 id="仓库简介"><a href="#仓库简介" class="headerlink" title="仓库简介"></a>仓库简介</h3><h4 id="类型仓库：proxy、hosted、group，-。"><a href="#类型仓库：proxy、hosted、group，-。" class="headerlink" title="类型仓库：proxy、hosted、group， 。"></a>类型仓库：proxy、hosted、group， 。</h4><ul>
<li>proxy是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy，当用户向这个proxy请求一个artifact，这个proxy就会先在本地查找，如果找不到的话，就会从远程仓库下载，然后返回给用户，相当于起到一个中转的作用。</li>
<li>hosted是宿主仓库，用户可以把自己的一些构件，deploy到hosted中，也可以手工上传构件到hosted里。比如说oracle的驱动程序，ojdbc6.jar，在central repository是获取不到的，就需要手工上传到hosted里。</li>
<li>group是仓库组，在maven里没有这个概念，是nexus特有的。目的是将上述多个仓库聚合，对用户暴露统一的地址，这样用户就不需要在pom中配置多个地址，只要统一配置group的地址就可以了。</li>
<li>还有virtual等类型。</li>
</ul>
<h4 id="常用仓库"><a href="#常用仓库" class="headerlink" title="常用仓库"></a>常用仓库</h4><p>Central是maven默认仓库，一般会配置3个hosted repository，分别是3rd party、Snapshots、Releases，分别用来保存第三方jar（典型的比如ojdbc6.jar），项目组内部的快照、项目组内部的发布版。对于Deployment Policy这个选项，一般Snapshots会配置成允许，而Releases和3rd party会设置为禁止。Apache Snapshots，Codehaus Snapshots等仓库也可以按需添加。</p>
<h4 id="开启远程索引"><a href="#开启远程索引" class="headerlink" title="开启远程索引"></a>开启远程索引</h4><ul>
<li>点击左边Administration菜单下面的Repositories，找到右边仓库，在configuration下把Download Remote Indexes修改为true。在仓库上右键，选择Repari Index，这样Nexus就会去下载远程的索引文件。仓库对应的网址如下，可以浏览器访问仓库。</li>
<li><code>Central   http://repo1.maven.org/maven2/</code> </li>
<li><code>Apache  https://repository.apache.org/content/repositories/snapshots/</code></li>
</ul>
<h3 id="项目仓库配置、Maven仓库配置、nexus仓库的关系"><a href="#项目仓库配置、Maven仓库配置、nexus仓库的关系" class="headerlink" title="项目仓库配置、Maven仓库配置、nexus仓库的关系"></a>项目仓库配置、Maven仓库配置、nexus仓库的关系</h3><hr>
<ul>
<li>项目仓库配置是maven项目的pom.xml中写的。</li>
<li>Maven仓库配置是maven软件中settings.xml中写的。</li>
<li>Nexus仓库配置好后，被maven项目引用或者是被maven软件引用。</li>
<li>Eclipse中用m2e插件关联起maven软件和maven项目。Eclipse的maven repositories包括：local、global、project和custom的。</li>
<li>Local对应settings.xml中的设置，global默认对应central仓库默认地址，project对应的是项目的pom文件的设置。Maven repo视图可以在window-&gt;show view-&gt;other-&gt;maven repo中打开。注意：没打开一个工程的时候，project repo可能是空的，eclipse加载项目时会有project repo。</li>
</ul>
<h3 id="建立私服仓库"><a href="#建立私服仓库" class="headerlink" title="建立私服仓库"></a>建立私服仓库</h3><hr>
<h4 id="上传到第三方库"><a href="#上传到第三方库" class="headerlink" title="上传到第三方库"></a>上传到第三方库</h4><p>将类库复制到第三方repo对应的存储文件夹下，建立index即可。可以在browse storage中生成存储index。</p>
<h4 id="建立group仓库"><a href="#建立group仓库" class="headerlink" title="建立group仓库"></a>建立group仓库</h4><p>建立一个group类型仓库，添加其他仓库，注意左边表示添加到group中。排列顺序按照先后影响仓库查找顺序。注意：本文的示例都是基于下面的group repo设置情况的。</p>
<h3 id="引用私服仓库"><a href="#引用私服仓库" class="headerlink" title="引用私服仓库"></a>引用私服仓库</h3><hr>
<h4 id="仓库请求流程"><a href="#仓库请求流程" class="headerlink" title="仓库请求流程"></a>仓库请求流程</h4><ol>
<li>从central repo下载很多必要的jar和pom，可能被墙而下载了很多.lastUpdate文件。</li>
<li>从私服代理仓库下载jar和pom。Maven在私服中查找，如果私服有就下载到本地，没有时私服就尝试联网下载，下载到了就放到私服并给用户，私服被墙而下载到.lastUpdate文件时，也会传给本地，这就让maven认为所有网上都没有该jar，不会继续查找其他repo。</li>
<li>从没被私服代理的仓库下载jar和pom。如果私服没有找到该jar的任何相关文件，就会从引入的其他仓库中下载（比如使用了一些比较小众的repo或jar包，而私服往往只有几个大的repo地址）。</li>
<li>注意.lastUpdate文件被maven认为是jar包不可获取，所以不会再次尝试下载jar，所以每次update项目应该使用force update snapshot/release。</li>
</ol>
<h4 id="仓库镜像"><a href="#仓库镜像" class="headerlink" title="仓库镜像"></a>仓库镜像</h4><ul>
<li>在maven的settingss.xml中添加对仓库的全局代理。<ul>
<li>这可能包括<code>&lt;servers&gt;</code>用户登陆密码、<code>&lt;mirrors&gt;</code>代理镜像设置、<code>&lt;profiles&gt;</code>配置文件设置（含<code>&lt;repository&gt;</code>仓库配置、<code>&lt;pluginRepositories&gt;</code>插件仓库配置）、<code>&lt;activeProfiles&gt;</code>配置文件激活设置。</li>
<li>nexus最简单的情况下（仓库不设置密码等情况，这与admin密码不同），将maven对central仓库的请求用nexus的public仓库代理的设置<code>&lt;mirrorOf&gt;zyy&lt;/mirrorOf&gt;</code>，如果是*就是代理所有。其中的url是nexus中的public仓库的发布路径。</li>
</ul>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">&lt;mirrors&gt;</div><div class="line">   &lt;mirror&gt;  </div><div class="line">        &lt;id&gt;tcm&lt;/id&gt;  </div><div class="line">        &lt;name&gt;tcm repo&lt;/name&gt;  </div><div class="line">        &lt;url&gt;http://10.15.82.93:8081/nexus/content/groups/public/&lt;/url&gt;  </div><div class="line">        &lt;mirrorOf&gt;*&lt;/mirrorOf&gt;  </div><div class="line">     &lt;/mirror&gt; </div><div class="line">&lt;/mirrors&gt;</div></pre></td></tr></table></figure>
<h4 id="设置Maven项目的pom-xml"><a href="#设置Maven项目的pom-xml" class="headerlink" title="设置Maven项目的pom.xml"></a>设置Maven项目的pom.xml</h4><p>对项目pom进行配置，将repo的url直接对应nexus仓库的发布路径。注意：</p>
<ul>
<li>仓库以id值作为区分，而不是name值。</li>
<li>相同的url（相差最后一个/的url其实网址是同一个，可以用浏览器打开试试）指向同一个repo。</li>
<li>Repo的id除非url相同，否则不应同id，那会产生repo覆盖。Pom中id不应使用central，因为中央仓库默认id为central，这样容易产生混乱。当然及时pom中id为central也不会覆盖全局的central，因为中央仓库优先级最高。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line">&lt;repositories&gt;</div><div class="line">	&lt;repository&gt;</div><div class="line">		&lt;snapshots&gt;</div><div class="line">			&lt;enabled&gt;true&lt;/enabled&gt;</div><div class="line">		&lt;/snapshots&gt;</div><div class="line">		&lt;id&gt;tcm&lt;/id&gt;</div><div class="line">		&lt;name&gt;tcm Nexus Repository&lt;/name&gt;</div><div class="line">		&lt;url&gt;http://10.15.82.93:8081/nexus/content/groups/public/&lt;/url&gt;</div><div class="line">	&lt;/repository&gt;</div><div class="line">	&lt;repository&gt;</div><div class="line">		&lt;id&gt;uk&lt;/id&gt;</div><div class="line">		&lt;name&gt;central&lt;/name&gt;</div><div class="line">		&lt;url&gt;http://uk.maven.org/maven2/&lt;/url&gt;</div><div class="line">	&lt;/repository&gt;</div><div class="line">	&lt;repository&gt;</div><div class="line">		&lt;id&gt;xss-html-filter releases&lt;/id&gt;</div><div class="line">		&lt;name&gt;xss-html-filter Releases Repository&lt;/name&gt;</div><div class="line">		&lt;url&gt;http://xss-html-filter.sf.net/releases/&lt;/url&gt;</div><div class="line">	&lt;/repository&gt;</div><div class="line">	&lt;repository&gt;</div><div class="line">		&lt;id&gt;mvn-repo&lt;/id&gt;</div><div class="line">		&lt;url&gt;http://maven.ansj.org/&lt;/url&gt;</div><div class="line">	&lt;/repository&gt;</div><div class="line">&lt;/repositories&gt;</div></pre></td></tr></table></figure>
<h3 id="部署构件到nexus发布jar包"><a href="#部署构件到nexus发布jar包" class="headerlink" title="部署构件到nexus发布jar包"></a>部署构件到nexus发布jar包</h3><hr>
<ul>
<li>部署的意义：为了将各种repo中都没有的jar包放到maven仓库中管理和下载，可以将该jar放到私服上。这个jar可能是比较小众化的，也可能是自己编写的。</li>
<li>整体设置推荐<ul>
<li>私服使用交换机网关连接外网，最好能翻墙。</li>
<li>下载基本所有的远程仓库文件并添加到第三方库中。所以基本上保证私服含有所有需要的依赖，即使不存在的依赖也可以通过外网下载（翻墙）。</li>
<li>进行构建发布配置。如果构件部署未设置，要发布的话使用文件添加方式。</li>
</ul>
</li>
</ul>
<h4 id="文件上传到私服"><a href="#文件上传到私服" class="headerlink" title="文件上传到私服"></a>文件上传到私服</h4><ul>
<li>直接将jar文件(含pom文件等)复制到nexus仓库storage下对应的GAV，更新index即可。虽然简单，但是只适用于文件少，更新不频繁的操作，因为每次都要找jar相应的文件夹。比较粗暴的方式是上传整个本地仓库，与私服仓库文件夹进行覆盖，但是可能存在上传.lastUpdate文件等情况。</li>
<li>适用于私服没翻墙，但是想把一些从墙外下载的包放到私服上。</li>
</ul>
<h4 id="页面上传到私服"><a href="#页面上传到私服" class="headerlink" title="页面上传到私服"></a>页面上传到私服</h4><ul>
<li>直接用admin登录nexus管理界面，找到3rd方仓库，使用页面上传的方式。</li>
<li>适用于上传自定义的jar文件。</li>
</ul>
<h4 id="使用maven-deploy发布到私服"><a href="#使用maven-deploy发布到私服" class="headerlink" title="使用maven deploy发布到私服"></a>使用maven deploy发布到私服</h4><p>这种发布方式的缺点在于所有用户都需要配置自己的maven中的server用户信息，优点在于一旦配置之后，可以支持高频率自动化的发布工作。适用于发布项目构件。</p>
<ul>
<li>设置项目pom将构件发布到snapshot。在私服将snapshot设置允许allow deployment，并在group repo中涵盖snapshot仓库，记录snapshot的routing地址。</li>
<li>配置项目pom.xml的<code>&lt;distributionManagement&gt;</code>。其中包括<code>&lt;repository&gt;&lt;snapshotRepository&gt;</code> snapshot版本构件设置。</li>
<li>设置nexus用户权限。因为发布构建需要用户登录的权限。先管理员登录nexus，在security中的users配置，可以看到admin、anonymous、deployment三个用户，他们的权限privilege trace是不同的，具体权限略。本文选用deployment用户进行登录并发布。在deployment用户右键，设置密码为deployment。</li>
<li>在maven软件的settings.xml的<code>&lt;servers&gt;</code>中进行用户配置。这里面的id值对应的就是项目pom中设置的zyy-snapshots，填写好登录nexus的用户名和密码如下。</li>
<li>用cmd进入maven工程下，运行mvn deploy，进行发布。</li>
</ul>

      
    </div>

    <div>
      
        

      
    </div>

    <div>
      
        

      
    </div>

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/Automated-build-tools/" rel="tag">#Automated build tools</a>
          
        </div>
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2017/01/12/Software/Java Web/Lucene/" rel="next" title="Lucene">
                <i class="fa fa-chevron-left"></i> Lucene
              </a>
            
          </div>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2017/01/12/Software/Java Web/Mybatis/" rel="prev" title="Mybatis">
                Mybatis <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    


  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel ">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/statics/images/avatar.png"
               alt="gatewayzy" />
          <p class="site-author-name" itemprop="name">gatewayzy</p>
          <p class="site-description motion-element" itemprop="description">blog website with hexo and github pages</p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">70</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          
            <div class="site-state-item site-state-categories">
              <a href="/categories">
                <span class="site-state-item-count">10</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/tags">
                <span class="site-state-item-count">38</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
        </div>

        
        

        
        
          <div class="links-of-blogroll motion-element links-of-blogroll-inline">
            <div class="links-of-blogroll-title">
              <i class="fa  fa-fw fa-globe"></i>
              友情链接
            </div>
            <ul class="links-of-blogroll-list">
              
                <li class="links-of-blogroll-item">
                  <a href="https://github.com/gatewayzy" title="Github-gatewayzy" target="_blank">Github-gatewayzy</a>
                </li>
              
                <li class="links-of-blogroll-item">
                  <a href="http://google.com/" title="Goolge" target="_blank">Goolge</a>
                </li>
              
                <li class="links-of-blogroll-item">
                  <a href="http://wiki.jikexueyuan.com/" title="Wiki-jike" target="_blank">Wiki-jike</a>
                </li>
              
            </ul>
          </div>
        

      </section>

      
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">
            
              
            
            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#Make、ant、maven等工具比较"><span class="nav-number">1.</span> <span class="nav-text">Make、ant、maven等工具比较</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Maven基础"><span class="nav-number">2.</span> <span class="nav-text">Maven基础</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Maven生命周期管理"><span class="nav-number">2.1.</span> <span class="nav-text">Maven生命周期管理</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Maven-jar包"><span class="nav-number">2.2.</span> <span class="nav-text">Maven jar包</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#Maven坐标"><span class="nav-number">2.2.1.</span> <span class="nav-text">Maven坐标</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#依赖管理"><span class="nav-number">2.2.2.</span> <span class="nav-text">依赖管理</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#依赖排除"><span class="nav-number">2.2.3.</span> <span class="nav-text">依赖排除</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Maven仓库解析"><span class="nav-number">2.3.</span> <span class="nav-text">Maven仓库解析</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#仓库解析"><span class="nav-number">2.3.1.</span> <span class="nav-text">仓库解析</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#远程仓库版本过滤"><span class="nav-number">2.3.2.</span> <span class="nav-text">远程仓库版本过滤</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Maven插件"><span class="nav-number">2.4.</span> <span class="nav-text">Maven插件</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#插件介绍"><span class="nav-number">2.4.1.</span> <span class="nav-text">插件介绍</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#常用插件"><span class="nav-number">2.4.2.</span> <span class="nav-text">常用插件</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Maven运行内存设置"><span class="nav-number">2.5.</span> <span class="nav-text">Maven运行内存设置</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#修改项目的maven-build内存"><span class="nav-number">2.5.1.</span> <span class="nav-text">修改项目的maven build内存</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#修改maven的内存配置"><span class="nav-number">2.5.2.</span> <span class="nav-text">修改maven的内存配置</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#添加系统环境变量"><span class="nav-number">2.5.3.</span> <span class="nav-text">添加系统环境变量</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Maven项目的版本规定"><span class="nav-number">2.6.</span> <span class="nav-text">Maven项目的版本规定</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#习惯优于配置"><span class="nav-number">2.7.</span> <span class="nav-text">习惯优于配置</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#聚合与继承"><span class="nav-number">2.8.</span> <span class="nav-text">聚合与继承</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#灵活构建：属性、profile、资源过滤三大特性"><span class="nav-number">2.9.</span> <span class="nav-text">灵活构建：属性、profile、资源过滤三大特性</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#属性"><span class="nav-number">2.9.1.</span> <span class="nav-text">属性</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#资源过滤"><span class="nav-number">2.9.2.</span> <span class="nav-text">资源过滤</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Profile"><span class="nav-number">2.9.3.</span> <span class="nav-text">Profile</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#激活方式："><span class="nav-number">2.9.4.</span> <span class="nav-text">激活方式：</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Maven-使用"><span class="nav-number">3.</span> <span class="nav-text">Maven 使用</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Maven配置"><span class="nav-number">3.1.</span> <span class="nav-text">Maven配置</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#Eclipse中使用maven"><span class="nav-number">3.1.1.</span> <span class="nav-text">Eclipse中使用maven</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Maven命令行管理项目"><span class="nav-number">3.1.2.</span> <span class="nav-text">Maven命令行管理项目</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#eclipse建立Maven项目"><span class="nav-number">3.1.3.</span> <span class="nav-text">eclipse建立Maven项目</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#常用的repo仓库"><span class="nav-number">3.2.</span> <span class="nav-text">常用的repo仓库</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问题与解决"><span class="nav-number">4.</span> <span class="nav-text">问题与解决</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#错误Dynamic-Web-Module-3-0-requires-Java-1-6-or-newer"><span class="nav-number">4.1.</span> <span class="nav-text">错误Dynamic Web Module 3.0 requires Java 1.6 or newer</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#错误missing-artifact：…jar"><span class="nav-number">4.2.</span> <span class="nav-text">错误missing artifact：…jar</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#错误Failed-to-read-artifact-descriptor-for-org-fnlp-fnlp-core-jar-2-1"><span class="nav-number">4.3.</span> <span class="nav-text">错误Failed to read artifact descriptor for org.fnlp:fnlp-core:jar:2.1</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#缺少src-test-java等目录"><span class="nav-number">4.4.</span> <span class="nav-text">缺少src/test/java等目录</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Maven私服Nexus"><span class="nav-number">5.</span> <span class="nav-text">Maven私服Nexus</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#安装启动nexus"><span class="nav-number">5.1.</span> <span class="nav-text">安装启动nexus</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#安装"><span class="nav-number">5.1.1.</span> <span class="nav-text">安装</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#启动nexus"><span class="nav-number">5.1.2.</span> <span class="nav-text">启动nexus</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Nexus配置"><span class="nav-number">5.2.</span> <span class="nav-text">Nexus配置</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#Nexus使用代理上网"><span class="nav-number">5.2.1.</span> <span class="nav-text">Nexus使用代理上网</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#仓库简介"><span class="nav-number">5.3.</span> <span class="nav-text">仓库简介</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#类型仓库：proxy、hosted、group，-。"><span class="nav-number">5.3.1.</span> <span class="nav-text">类型仓库：proxy、hosted、group， 。</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#常用仓库"><span class="nav-number">5.3.2.</span> <span class="nav-text">常用仓库</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#开启远程索引"><span class="nav-number">5.3.3.</span> <span class="nav-text">开启远程索引</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#项目仓库配置、Maven仓库配置、nexus仓库的关系"><span class="nav-number">5.4.</span> <span class="nav-text">项目仓库配置、Maven仓库配置、nexus仓库的关系</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#建立私服仓库"><span class="nav-number">5.5.</span> <span class="nav-text">建立私服仓库</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#上传到第三方库"><span class="nav-number">5.5.1.</span> <span class="nav-text">上传到第三方库</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#建立group仓库"><span class="nav-number">5.5.2.</span> <span class="nav-text">建立group仓库</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#引用私服仓库"><span class="nav-number">5.6.</span> <span class="nav-text">引用私服仓库</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#仓库请求流程"><span class="nav-number">5.6.1.</span> <span class="nav-text">仓库请求流程</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#仓库镜像"><span class="nav-number">5.6.2.</span> <span class="nav-text">仓库镜像</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#设置Maven项目的pom-xml"><span class="nav-number">5.6.3.</span> <span class="nav-text">设置Maven项目的pom.xml</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#部署构件到nexus发布jar包"><span class="nav-number">5.7.</span> <span class="nav-text">部署构件到nexus发布jar包</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#文件上传到私服"><span class="nav-number">5.7.1.</span> <span class="nav-text">文件上传到私服</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#页面上传到私服"><span class="nav-number">5.7.2.</span> <span class="nav-text">页面上传到私服</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#使用maven-deploy发布到私服"><span class="nav-number">5.7.3.</span> <span class="nav-text">使用maven deploy发布到私服</span></a></li></ol></li></ol></li></ol></div>
            
          </div>
        </section>
      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2018</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">gatewayzy</span>
</div>

<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Mist
  </a>
</div>

        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/vendors/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.0.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.0.1"></script>



  
  

  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.0.1"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.0.1"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.0.1"></script>



  



  




  
  

  
  <script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
    });
  </script>

  <script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
      for (i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';
      }
    });
  </script>
  <script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>



  

  
<script type="text/javascript" async src="//push.zhanzhang.baidu.com/push.js">
</script>


</body>
</html>
